package _9_博客园Redis

import (
	"fmt"
	"github.com/go-redis/redis"
)

/*golang redis常用函数列表：
Set - 设置一个key的值
Get - 查询key的值
GetSet - 设置一个key的值，并返回这个key的旧值
SetNX - 如果key不存在，则设置这个key的值
MGet - 批量查询key的值
MSet - 批量设置key的值
Incr,IncrBy,IncrByFloat - 针对一个key的数值进行递增操作
Decr,DecrBy - 针对一个key的数值进行递减操作
Del - 删除key操作，可以批量删除
Expire - 设置key的过期时间
Setrange - 命令用指定的字符串覆盖给定 key 所储存的字符串值，覆盖的位置从偏移量 offset 开始 SETRANGE KEY_NAME OFFSET VALUE
Getrange - 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)
Getbit - 命令用于对 key 所储存的字符串值，获取指定偏移量上的位(bit)  GETBIT KEY_NAME OFFSET
Setbit - 命令用于对 key 所储存的字符串值 Setbit KEY_NAME OFFSET
*/

func main() {
	//(0)初始化一个新的redis client
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // redis地址
		Password: "",               // redis没密码，没有设置，则留空
		DB:       0,                // 使用默认数据库
	})

	//(1)Set设置一个key的值
	// 第三个参数代表key的过期时间，0代表不会过期。
	err := client.Set("key", "value", 0).Err()
	if err != nil {
		panic(err)
	}

	//(2)Get查询key的值
	// Result函数返回两个值，第一个是key的值，第二个是错误信息
	val, err := client.Get("key").Result()
	// 判断查询是否出错
	if err != nil {
		panic(err)
	}
	fmt.Println("key", val)

	//(3)GetSet设置一个key的值，并返回这个key的旧值
	// Result函数返回两个值，第一个是key的值，第二个是错误信息
	oldVal, err := client.GetSet("key", "new value").Result()
	if err != nil {
		panic(err)
	}
	// 打印key的旧值
	fmt.Println("key", oldVal)

	//(4)SetNX如果key不存在，则设置这个key的值
	// 第三个参数代表key的过期时间，0代表不会过期。
	err1 := client.SetNX("key", "value", 0).Err()
	if err != nil {
		panic(err1)
	}

	//(5)MGet批量查询key的值
	// MGet函数可以传入任意个key，一次性返回多个值。通过fo range循环取值
	// 这里Result返回两个值，第一个值是一个数组，第二个值是错误信息
	vals, err := client.MGet("key1", "key2", "key3").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println(vals)

	//(6)MSet批量设置key的值
	err2 := client.MSet("key1", "value1", "key2", "value2", "key3", "value3").Err()
	if err != nil {
		panic(err2)
	}

	//(7)Incr,IncrBy针对一个key的数值进行递增操作
	// Incr函数每次加一
	val1, err := client.Incr("key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("最新值", val1)

	// IncrBy函数，可以指定每次递增多少
	val2, err := client.IncrBy("key", 2).Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("最新值", val2)

	// IncrByFloat函数，可以指定每次递增多少，跟IncrBy的区别是累加的是浮点数
	val3, err := client.IncrByFloat("key", 2).Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("最新值", val3)

	//(8)Decr,DecrBy针对一个key的数值进行递减操作
	// Decr函数每次减一
	val4, err := client.Decr("key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("最新值", val4)

	// DecrBy函数，可以指定每次递减多少
	val5, err := client.DecrBy("key", 2).Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("最新值", val5)

	//9.Del删除key操作，支持批量删除
	// 删除key
	client.Del("key")
	// 删除多个key, Del函数支持删除多个key
	err3 := client.Del("key1", "key2", "key3").Err()
	if err != nil {
		panic(err3)
	}

	//(10)Expire设置key的过期时间,单位秒
	client.Expire("key", 3)
}
